最后更新时间:2019年7月4日
在线地图显示方法
MapGIS移动端支持的在线地图数据类型包括:MapGIS的在线矢量、瓦片地图服务,基于OGC标准的地图服务(WMS、WMTS),以及第三方在线地图服务(天地图、Google地图、OSM地图、百度地图、高德地图、Bing地图等)。
在线地图数据来源众多,但显示方法原理相同,方法类似,在线地图的加载方法可以归纳为以下的两种,所有在线地图都可以通过这两种方式加载显示。
方法 | 接口 | 地图类型 | 使用场景 |
---|---|---|---|
服务图层方式 | setMapAsync | 所有在线地图 | 不需配置地图文档 |
地图文档方式 | loadFromFileAsync / loadFromDocumentAsync | 所有在线地图 | 需要配置地图文档 |
一、服务图层方式
通过地图服务URL地址构造MGSServerLayer服务图层,从而构建MGSMap,然后调用setMap / setMapAsync方法加载。此方法经常采用于图层数量少的情况下,简单便捷,不需配置地图文档。接下来以MapGIS IGServer在线矢量地图服务为例展示实现过程。
//定义地图视图、地图 @property (weak, nonatomic) IBOutlet MGSMapView *mapView; @property (nonatomic,strong) MGSMap *map; //地图服务,igserver矢量地图服务类型为MAPSERVER_TYPE_IGSERVER_VECTOR MGSMapServer* mapServer = [MGSServerLayer createMapServerByType:MAPSERVER_TYPE_IGSERVER_VECTOR]; [mapServer setName:@"IGServer服务图层"]; [mapServer setUrl:@"http://develop.smaryun.com:6163/igs/rest/mrms/docs/WorldJWVector"]; //创建服务图层 MGSServerLayer *serverLayer=[[MGSServerLayer alloc] init]; [serverLayer setMapServer:mapServer]; //创建地图 if (_map == nil) { _map=[[MGSMap alloc] init]; } //给地图添加服务图层 [_map append:serverLayer]; //为地图容器设置地图 [_mapView setMapAsync:_map callback:^(BOOL success) { if (success) { //地图加载成功 } else { //地图加载失败 } }];
所有在线地图加载使用的方法都一样,区别只是在构建MapServer地图服务对象时选择的服务类型的不同。MapGIS Mobile提供诸多类型的地图服务,例如MapGIS地图服务、OGC服务、天地图、Google地图服务、百度地图、高德地图等等,其地图服务类型对应的接口由MGSMapServer类提供,关键的地图服务类型如下表所示:
数据来源 | 数据类型 | 地图服务类型 |
---|---|---|
在线 | IGServer矢量地图服务 | MAPSERVER_TYPE_IGSERVER_VECTOR |
IGServer瓦片地图服务 | MAPSERVER_TYPE_IGSERVER_TILE | |
WMS服务 | MAPSERVER_TYPE_OGC_WMS | |
WMTS服务 | MAPSERVER_TYPE_OGC_WMTS | |
天地图服务 | MAPSERVER_TYPE_TIANDITU | |
谷歌地图服务 | MAPSERVER_TYPE_GOOGLE_MAP | |
百度地图服务 | MAPSERVER_TYPE_BAIDU_MAP | |
OSM地图服务 | MAPSERVER_TYPE_OPENSTREET_STANDARD | |
Bing地图服务 | MAPSERVER_TYPE_BING_MAP | |
离线 | 瓦片地图 | MAPSERVER_TYPE_TDF |
为方便用户使用公共地图服务,除了MapGIS IGServer地图服务、天地图系列的服务、OGC标准的WMS / WMTS服务,其他所有地图服务在接口内部已经设置好服务地址,不需用户调用setUrl方法自己设置。
重点说明:根据天地图的要求,使用天地图提供的地图服务,需要申请key,对此MapGIS Mobile对接了此要求,调用方法稍有不同,区别在于构建MGSMapServer时还需设置认证信息,如下所示:
//创建地图服务,并设置名称、URL地址 MGSMapServer* mapServer = [MGSServerLayer createMapServerByType:MAPSERVER_TYPE_TIANDITU]; [mapServer setName:@"天地图服务"]; //设置URL:矢量底图 [mapServer setUrl:@"http://t0.tianditu.gov.cn/vec_c/wmts"]; //设置认证信息 [mapServer setAuthenticationWithUser:@"tk" pwd:@"用户申请的key"]; //服务图层 MGSServerLayer *serverLayer=[[MGSServerLayer alloc] init]; [serverLayer1 setMapServer:mapServer];
说明:setAuthenticationWithUser: pwd:方法中pwd的值即key值,需要用户根据自己的应用申请,申请地址为天地图官网。
二、地图文档方式
将在线地图服务URL组织为mapx地图文档之后,可调用loadFromFileAsync或loadFromDocumentAsync方法进行加载。
//定义地图视图控件对象 @property (weak, nonatomic) IBOutlet MGSMapView *mapView; //在线地图文档路径 NSString *onlineMapPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject]stringByAppendingPathComponent:@"/MapGIS Mobile 2D Sample/Map/MapShow/OnlineWorldJWVector.mapx"]; //异步方式加载地图 [_mapView loadFromFileAsync:onlineMapPath]; //设置地图代理 [_mapView setDelegate:self];
地图加载回调函数:
//开始加载地图监听 -(void)willStartLoadingMapWithMapView:(MGSMapView *)mapView strDocPath:(NSString *)strDocPath{ NSLog(@"开始加载地图"); } //加载地图完成事件监听 -(void)didFinishLoadingMapWithMapView:(MGSMapView *)mapView strDocPath:(NSString *)strDocPath{ NSLog(@"地图加载成功"); } //加载地图失败事件监听 -(void)didFailLoadingMapWithMapView:(MGSMapView *)mapView strDocPath:(NSString *)strDocPath{ NSLog(@"地图加载失败"); }
代码说明:loadFromFileAsync接口中传入的是在线地图文档mapx格式文件的完整路径,mapx地图文档需要用户自己在MapGIS桌面平台软件中进行组织,然后拷贝到移动设备中。
//定义地图视图控件、地图文档对象 @property (weak, nonatomic) IBOutlet MGSMapView *mapView; @property (nonatomic,strong) MGSDocument *document; //在线地图文档路径 NSString *onlineMapPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject]stringByAppendingPathComponent:@"/MapGIS Mobile 2D Sample/Map/MapShow/OnlineWorldJWVector.mapx"]; //创建地图文档对象 _document=[[MGSDocument alloc] init]; //开辟线程,GCD方式创建线程(串行、异步) //以loadfromdocumentaync方式加载在线矢量地图文档,需要在子线程中执行open方法,请求在线数据 dispatch_queue_t queue=dispatch_queue_create("mapshow", NULL); dispatch_async(queue, ^{ //打开地图文档 long a=[_document open:onlineMapPath]; if (a>0) { // 回到主线程 dispatch_async(dispatch_get_main_queue(), ^{ //异步方式加载地图 [_mapView loadFromDocumentAsync:_document andIndex:0 callback:^(BOOL success) { if (success) { //地图加载成功 } else { //地图加载失败 } }]; }); } });
显示效果如下所示: